Core Graphics
概要
提供する機能には、パスベースの描画、色彩管理、アンチエイリアスレンダリング、PDFドキュメント生成等がある。
Quartz 2D による描画における重要な概念として、Graphics Context がある。これは、簡単にいうと出力対象と描画処理の間の中間層である。画像を描画する場合、その出力先は PDF かもしれないし物理的な紙、あるいはウインドウ上の View かもしれず、その各々に対して同様の描画を指示するには様々な調整が必要になるが、graphics context はこの調整のための機能を内包しているため、利用側はこの context に対して描画指示を行い、出力するだけで良いようになっている。 また、Graphics Context には Graphics State が格納されている。これは context が出力される際に渡されるパラメータ群であり、例え色やアルファ値、線の太さなどが格納されている。
Graphics Context を得る方法は二種類ある。Quartz の Graphics Context を作成する関数を作る方法と、Carbon や Cocoa 等の framework から提供されているより高レベルな関数を使う方法である。Quartz 自体は PDF や bitmap 用の Graphics Context を生成する機能を提供している。一方で、例えば Cocoa であれば window の Graphics context を取得する関数を提供しているし、UIKit であれば view の Graphics context を取得する関数を提供している。 また、UIKit、すなわち iOS 環境では、描画先は基本的に UIView になる。UIView において実際に描画を行なっているのは drawRect: であり、View がディスプレイに描画された際にはこれが呼び出され、描画が行われる。このメソッドが呼び出される前には描画を開始するための描画環境の設定は済んでいて、この設定の中では UIView 対応の Graphics Context の生成も行われている。そのため、View に対して描画を行いたい場合は、この context にアクセスすれば良いらしい。この時の Graphics Context にアクセスするためには、UIKit が提供する関数である UIGraphicsGetCurrentContext を呼びだす。 サンプルコード
赤い円を描きたい場合。検索してヒットする描画のサンプルコードは、View の Graphics Context を取得して利用するパターンのものが多いが、Renderer 経由で最終的に UIImage を出力するコードを描いてみた。グローバルな領域にアクセスしにいかないし、こちらの方がわかりやすいと思う。 code:swift
func drawRedMinimumCircle() -> UIImage {
// context を保持する renderer
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 10, height: 10))
// context から image を生成
let image = renderer.image { ctx in
// context に対して描画する
let circle = UIBezierPath(arcCenter: CGPoint(x: 5, y: 5), radius: 2.5, startAngle: 0, endAngle: CGFloat(Double.pi)*2, clockwise: true)
ctx.cgContext.setFillColor(UIColor.red.cgColor)
ctx.cgContext.addPath(circle.cgPath)
ctx.cgContext.drawPath(using: .fill)
}
return image
}
後で読む